"""
百度搜索页面模块

实现百度首页的页面对象模型，封装了搜索框、搜索按钮等元素的操作方法。
"""

from selenium.webdriver.common.by import By
from page_base.page_base import Base
from utils.logger import log


class BaiduPage(Base):
    """
    百度搜索页面类
    封装了百度首页的所有元素定位和操作方法
    """
    
    # 元素定位器 - 使用可靠的定位方法
    SEARCH_INPUT = (By.ID, "kw")  # 搜索输入框
    SEARCH_BUTTON = (By.ID, "su")  # 搜索按钮
    NEWS_LINK = (By.LINK_TEXT, "新闻")  # 新闻链接
    MAP_LINK = (By.LINK_TEXT, "地图")  # 地图链接
    VIDEO_LINK = (By.LINK_TEXT, "视频")  # 视频链接
    IMAGE_LINK = (By.LINK_TEXT, "图片")  # 图片链接
    RESULT_TITLE = (By.XPATH, "//h3/a")  # 搜索结果标题
    
    def search(self, keyword):
        """
        执行搜索操作
        :param keyword: 要搜索的关键词
        """
        log.info(f"开始搜索关键词: {keyword}")
        # 使用JavaScript直接操作元素，提高兼容性
        try:
            # 尝试通过ID定位并操作元素
            self.driver.execute_script(f"document.getElementById('kw').value = '{keyword}';")
            self.driver.execute_script("document.getElementById('su').click();")
            log.info("使用JavaScript执行搜索成功")
        except Exception as e:
            # 如果失败，尝试通过其他方式
            log.warning(f"JavaScript搜索失败: {str(e)}，尝试备用方法")
            # 备用方法：尝试通过name属性
            try:
                self.driver.execute_script(f"document.querySelector('input[name=wd]').value = '{keyword}';")
                self.driver.execute_script("document.querySelector('input[type=submit]').click();")
                log.info("使用备用JavaScript方法执行搜索成功")
            except Exception as e2:
                log.error(f"备用搜索方法也失败: {str(e2)}")
                raise
        
        # 等待搜索结果加载
        import time
        time.sleep(3)
        log.info("搜索操作完成")
    
    def click_news(self):
        """
        点击新闻链接
        """
        self.base_click(self.NEWS_LINK)
    
    def click_map(self):
        """
        点击地图链接
        """
        self.base_click(self.MAP_LINK)
    
    def click_video(self):
        """
        点击视频链接
        """
        self.base_click(self.VIDEO_LINK)
    
    def click_image(self):
        """
        点击图片链接
        """
        self.base_click(self.IMAGE_LINK)
    
    def get_search_results(self):
        """
        获取搜索结果标题列表
        :return: 搜索结果标题列表
        """
        results = self.driver.find_elements(*self.RESULT_TITLE)
        titles = [result.text for result in results]
        log.info(f"获取到搜索结果数量: {len(titles)}")
        return titles
    
    def navigate_to(self, url="https://www.baidu.com"):
        """
        导航到百度首页
        :param url: 百度首页URL，默认使用https://www.baidu.com
        """
        log.info(f"导航到百度首页: {url}")
        self.driver.get(url)
        self.driver.maximize_window()